package lianxi;

/**
 * 4 某个公司采用公用电话传递数据信息，数据是小于8位的整数，为了确保安全，在传递过程中需要加密，加密规则如下：
 * 首先将数据倒序，然后将每位数字都加上5，再用和除以10的余数代替该数字，最后将第一位和最后一位数字交换,加密之后类型为String
 * 请任意给定一个小于8位的整数，然后通过一个加密方法,把加密之后的字符串返回,并打印到控制台
 * 
 * 然后再通过一个解密的方法,传入加密的字符串,返回对应的int值,并打印到控制台
 * 
 * 思路 : 用一个方法加密
 * 
 * 解密方法返回int 打印
 * 
 * @author lenovo
 * @date 2020年7月30日 @time 上午10:01:42
 */
public class _04_ {

	public static void main(String[] args) {
		System.out.println(encryption(123456));
		System.out.println(decode(encryption(123456)));

	}

	/**
	 * 加密方法:
	 * 
	 * 首先数据倒序,将整数转为字符串,倒序遍历字符串,并存储新的字符串,新的转为 int
	 * 
	 * @param sum
	 * @return
	 */
	public static String encryption(int sum) {

		// 排除 错误数据
		if (sum < 0) {
			return null;
		}

		// 数据倒序
		String s1 = sum + "";
		String s2 = new String();
		int sum1 = 0;
		for (int i = s1.length() - 1; i >= 0; i--) {
			// 每一位数字加5 在对 10 取余
			sum1 = (s1.charAt(i) - 48 + 5) % 10;
			s2 += (sum1 + "");
		}
		// 交换首尾字符
		char[] chars = s2.toCharArray();
		s1 = new String(chars, 1, chars.length - 2);
		// s3 就是加密后的字符串
		String s3 = s2.charAt(s2.length() - 1) + s1 + s2.charAt(0);
		return s3;
	}

	/**
	 * 解密方法:
	 * 
	 * 数据能进来就不为空
	 * 
	 * 思路 :倒着来,先交换首尾位置
	 * 
	 * @param sum
	 * @return
	 */
	public static int decode(String sum) {
		char c = ' ';

		// 交换首尾位置
		char[] chars = sum.toCharArray();
		String s1 = new String(chars, 1, chars.length - 2);
		// s2 就是交换后的字符串
		String s2 = chars[chars.length - 1] + s1 + chars[0];

		// 56789 加密后是 01234 也就是说 : 要还原的数字为 0-4 直接加5
		// 01234 加密后是 56789 也就是说 : 要还原的数字为 5-9 直接减5

		// s3 字符串存放 还原了的数据
		String s3 = new String();
		for (int i = 0; i < s2.length(); i++) {
			c = s2.charAt(i);
			if (c >= '0' && c <= '4') {
				c += 5;
				s3 += c;
			} else if (c >= '5' && c <= '9') {
				c -= 5;
				s3 += c;
			}
		}
		// 新的字符串,存放倒序后的字符串
		String s4 = new String();
		// s3倒序
		for (int i = s3.length() - 1; i >= 0; i--) {
			c = s3.charAt(i);
			s4 += c;
		}
		// 还原后的数字
		int sum1 = Integer.parseInt(s4);

		return sum1;

	}
}
